SQL
Otázka od: Viktor Marek
15. 12. 2002 15:41
Zdravim
Uz dloho se potykam s timto problemem - Delphi 5, database DBIsam
Mam tabulku ke ktere pristupuji pomoci SQL dotazu.
Pri FormCreate zobrazuji data v DBGridu pres select * from "test.dat" order
by Prijmeni
Dale mam na formu Label ve kterem bych chtel zobrazovat soucet sloupce
Zaloha
Jakmile ale chci provest nize uvedeny Select vybehne ERROR
"Query1 Field
"Prijmeni" not found"
Query1.SQL.Clear;
Query1.SQL.Add('SELECT SUM(Zaloha) As ZalohyCelkem from "test.dat"');
Query1.Open;
Label1.caption:=IntToStr(Query1.FieldByName('ZalohyCelkem').AsInteger);
Neco mi naseptava, ze by to chtelo slozeny select ale nevim jak dal.
Diky za radu
Viktor Marek
viktor@mbox.vol.cz
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: delphi@hon.cz
26. 10. 2004 8:54
Ano pratele,
je to tady zase....
Uz mi to vase hastereni chybelo a tak jsem tu ja s mecem
Damoklovym. Jeden bude vyhnan z raje.
Mejme tabulku:
CREATE TABLE [_TABLE] (
[PROMENNA] varchar(50),
[HODNOTA] varchar(50)
)
Mejme dve transakce:
I.
BEGIN transaction
Print 'Updatuji promennou A'
update _table set HODNOTA = 2 where PROMENNA = 'A'
WAITFOR DELAY '00:00:20'
Print 'Hotovo A'
COMMIT transaction
II.
BEGIN transaction
PRINT 'Selektuji promennou B'
select * from _table where PROMENNA = 'B'
PRINT 'Hotovo B'
COMMIT transaction
Nyni otazky, ale prosim o "normalni" odpovedi (ja si z vas taky
nedelam srandu).
Proc skonci transakce II. az pote co skonci transakce I.? Proc do
transakce I. vstupuje i radek, ktery s ni nema co spolecneho?
A proc se tato situace zlepsi kdyz:
CREATE INDEX [new_index] ON [dbo].[_table]
([PROMENNA]) ?
A proc si myslim, ze ve FB to funguje hned napoprve?
A kde je Jan Tleskac?
Martin
Odpovedá: Milan Tomes
26. 10. 2004 9:04
Osobne si myslim, ze je to prave diky zamkum. Pri zapisu se prochazeji
jednotlive radky (a pri te prilezitosti je na ne "uvalen" zamek, ktery
zamezi jejich cteni druhou transakci) az do doby kdy se narazi na vyhovujici
radek. Potom je prvni transakce commitnuta a druha muze probehnout - ona
totiz ta druha ceka na odemceni zaznamu, ktere byly jiz precteny jinou
transakci, protoze take prochazi postupne celou tabulku a hleda odpovidajici
radek. Pri pouziti indexu je onen radek zjisten primo a neni nutno pouzit
table scan.
Ve FireBirdu toto opravdu bez problemu funguje i bez indexu - je to diky MGA
architekture.
S pozdravem
Milan Tomes
> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of delphi@hon.cz
> Sent: Tuesday, October 26, 2004 9:54 AM
>
> Mejme tabulku:
>
> CREATE TABLE [_TABLE] (
> [PROMENNA] varchar(50),
> [HODNOTA] varchar(50)
> )
>
> Mejme dve transakce:
>
> I.
>
> BEGIN transaction
> Print 'Updatuji promennou A'
> update _table set HODNOTA = 2 where PROMENNA = 'A'
> WAITFOR DELAY '00:00:20'
> Print 'Hotovo A'
> COMMIT transaction
>
> II.
> BEGIN transaction
> PRINT 'Selektuji promennou B'
> select * from _table where PROMENNA = 'B'
> PRINT 'Hotovo B'
> COMMIT transaction
>
> Proc skonci transakce II. az pote co skonci transakce I.? Proc do
> transakce I. vstupuje i radek, ktery s ni nema co spolecneho?
> A proc se tato situace zlepsi kdyz:
>
> CREATE INDEX [new_index] ON [dbo].[_table]
> ([PROMENNA]) ?
Odpovedá: Ing. Pavel Žilinec
16. 12. 2002 11:13
Myslim, ze pokud je zdrojem dat nejaky select, tak pak ZalohyCelkem by
nemelo byt fkcalculated, ale normalni pole. Pak uz by
DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger nemelo byt nulove.
Nevim jak v DBIsam, ale treba na SQL, pokud je nektera hodnota ve
sloupci null, tak potom by sum(sloupec) dala take null (tedy pri
AsInteger je to 0), V takovem pripdae bys jeste musel eliminovat null
hodnoty (bud ve where nebo jestli na DBIsam existuje isnull(), coalesce())
--------
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
VM> Zdavim
VM> Je mi to az blby ale i to jsem zkousel, ale vysledek
VM> DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger) je roven nule.
VM> Pole "ZalohyCelkem" nemam definovane v tabulce, pouze v Query jako
VM> fkcalculated
VM> begin
VM> DBISAMQuery1.SQL.Clear;
VM>
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
VM> doplatek, Sum(Zaloha) As ZalohyCelkem FROM "new.dat" Group By
VM> Prijmeni,jmeno');
VM> DBISAMQuery1.ExecSQL;
VM>
Label2.caption:=IntToStr(DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger)
VM> ;
VM> end;
VM> Co bych jeste mohl vyzkouset
VM> Diky radu
Odpovedá: Ing. Pavel Žilinec
17. 12. 2002 6:04
Pak to tedy znamena, ze nelze pouzit dotaz v dotaze, takze v jednom
selectu to proste nezjistis. Ale jak uz se tu nekde pravilo, udelej si
jeste jeden Query, ktery nebude mit nic jineho nez
select sum(Zaloha) as ZalohaCelkem from "new.dat"
a mel bys mit vysledek zajisteny (jen to znamena spusteni dalsiho
dotazu).
--------
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
VM> Zdravim
VM> Vyzkousel jsem
VM> Ing Pavel Zilinec
VM> SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, ZalohyCelkem =
VM> (select sum(pom.Zalohy) from "new.dat" pom) FROM "new.dat"
VM> select jde do chyby
"Right parentheses expected, instead found 'sum' in
VM> source column expression"
Odpovedá: ing. Jan Fiala
16. 12. 2002 6:04
15.12.2002 Viktor Marek:
> To jsem pochopil, ale porad mi neni jasne jak slozit SQl prikaz dohromady
> select * from "test.dat" order by Prijmeni se SELECT SUM(Zaloha) As
> ZalohyCelkem from "test.dat"'
V tomto úripade se tam nedava *, ale vyjmenuji se pole v tabulce,
ktere potrebujes, misto pole Zaloha se uvede Sum(Zaloha) a pouzije se
navic klauzule GroupBy (Prijmeni)
Ta ti zaruci, ze se to vyscita pro jednotlive lidi.
Doporucuji precist si aspon nejake zaklady SQL nebo aspon nahlednout
go helpu, ktery je soucasti Delphi:
\Program Files\Common Files\Borland Shared\BDE\localsql.hlp
--
Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Viktor Marek
16. 12. 2002 9:32
Zdravim
> Doporucuji precist si aspon nejake zaklady SQL nebo aspon nahlednout
To jsem opravdu udelal a prolezl jsem kde co.
Drive jsem do Query nedefinoval jednotliva pole a tak jsem na tento problem
nenarazil. Jednotlive selecty probihaly bez problemu. Jestli to bylo spravne
nebo se program drzel silou vule a ohleduplnosti k me osobe to nevim.
Vyzkousel jsem:
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
pokud do selectu nedam "zaloha" vybehne chyba "Field Zaloha not found"
pokud do selectu nedam Group By Prijmeni,jmeno ale jen Group By Prijmeni po
selectu se nezobrazi vice osob se stejnym prijmenim
Tak jak je select napsan
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
probehne bez problemu a v DBDridu se zobrazi vsechny osoby.
Jak ale dostanu do nejake promene vysledek "Sum(Zaloha)" (v Query ma
nadefinovane pole ZalohyCelkem)
a jde mi o soucet hodnot vsech poli "zaloha" pro vsechny osoby.
Diky za radu
Viktor Marek
viktor@mbox.vol.cz
> 15.12.2002 Viktor Marek:
> > To jsem pochopil, ale porad mi neni jasne jak slozit SQl prikaz
dohromady
> > select * from "test.dat" order by Prijmeni se SELECT SUM(Zaloha) As
> > ZalohyCelkem from "test.dat"'
>
> V tomto úripade se tam nedava *, ale vyjmenuji se pole v tabulce,
> ktere potrebujes, misto pole Zaloha se uvede Sum(Zaloha) a pouzije se
> navic klauzule GroupBy (Prijmeni)
> Ta ti zaruci, ze se to vyscita pro jednotlive lidi.
>
> Doporucuji precist si aspon nejake zaklady SQL nebo aspon nahlednout
> go helpu, ktery je soucasti Delphi:
> \Program Files\Common Files\Borland Shared\BDE\localsql.hlp
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: ing. Jan Fiala
16. 12. 2002 10:00
16.12.2002 Viktor Marek:
> Tak jak je select napsan
>
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
> probehne bez problemu a v DBDridu se zobrazi vsechny osoby.
> Jak ale dostanu do nejake promene vysledek "Sum(Zaloha)" (v Query ma
> nadefinovane pole ZalohyCelkem)
> a jde mi o soucet hodnot vsech poli "zaloha" pro vsechny osoby.
Select ... Sum(Zaloha) as Zaloha ...
Tim definujes, ze to vysledek SUM operace se bude jmenovat "Zaloha" a
pristupovat k nemu budes normalne pres FieldByName('Zaloha')
--
Jan Fiala
mailto:jan.fiala@iol.cz
Odpovedá: Käss, Pavel
16. 12. 2002 10:09
Ahoj Marku,
s tim cislo zaznamu, zaloha, doplatek Ti to snad ani nemuze fungovat (kdyz
mas Group By Prijmeni, jmeno) (urcite ne na Oraclu - vi nekdo o
protiprikladu jinde? Takova implementace SQL by snad byla proti
standardu)...
zkus
DBISAMQuery1.SQL.Add('SELECT prijmeni, jmeno, Sum(Zaloha) as
ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno');
ale nebudes mit cislozaznamu, doplatek a zaloha.
Mej se
Pavel
> -----Original Message-----
>
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
>
> Tak jak je select napsan
>
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
> probehne bez problemu a v DBDridu se zobrazi vsechny osoby.
>
> Jak ale dostanu do nejake promene vysledek "Sum(Zaloha)" (v Query ma
> nadefinovane pole ZalohyCelkem)
> a jde mi o soucet hodnot vsech poli "zaloha" pro vsechny osoby.
>
>
Odpovedá: Viktor Marek
16. 12. 2002 10:11
Zdavim
Je mi to az blby ale i to jsem zkousel, ale vysledek
DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger) je roven nule.
Pole "ZalohyCelkem" nemam definovane v tabulce, pouze v Query jako
fkcalculated
begin
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
doplatek, Sum(Zaloha) As ZalohyCelkem FROM "new.dat" Group By
Prijmeni,jmeno');
DBISAMQuery1.ExecSQL;
Label2.caption:=IntToStr(DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger)
;
end;
Co bych jeste mohl vyzkouset
Diky radu
Viktor Marek
viktor@mbox.vol.cz
> > Tak jak je select napsan
> >
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> > doplatek, Sum(Zaloha) FROM "new.dat" Group By Prijmeni,jmeno');
> > probehne bez problemu a v DBDridu se zobrazi vsechny osoby.
>
> > Jak ale dostanu do nejake promene vysledek "Sum(Zaloha)" (v Query ma
> > nadefinovane pole ZalohyCelkem)
> > a jde mi o soucet hodnot vsech poli "zaloha" pro vsechny osoby.
>
> Select ... Sum(Zaloha) as Zaloha ...
>
> Tim definujes, ze to vysledek SUM operace se bude jmenovat "Zaloha" a
> pristupovat k nemu budes normalne pres FieldByName('Zaloha')
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: ing. Jan Fiala
16. 12. 2002 10:30
V tomto pripade se pouziva DBISAMQuery1.Open ne DBISAMQuery1.ExecSQL
ExecSQL se pouziva pro prikazy, ktere nevraci mnozinu dat
--
Jan Fiala
mailto:jan.fiala@iol.cz
16.12.2002 Viktor Marek:
> Zdavim
> Je mi to az blby ale i to jsem zkousel, ale vysledek
> DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger) je roven nule.
> Pole "ZalohyCelkem" nemam definovane v tabulce, pouze v Query jako
> fkcalculated
> begin
> DBISAMQuery1.SQL.Clear;
>
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> doplatek, Sum(Zaloha) As ZalohyCelkem FROM "new.dat" Group By
> Prijmeni,jmeno');
> DBISAMQuery1.ExecSQL;
> Label2.caption:=IntToStr(DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger)
> ;
> end;
Odpovedá: Viktor Marek
16. 12. 2002 10:41
Zdravim
I to jsem zkousel se stejnym vysledkem.
Viktor Marek
viktor@mbox.vol.cz
> V tomto pripade se pouziva DBISAMQuery1.Open ne DBISAMQuery1.ExecSQL
>
> ExecSQL se pouziva pro prikazy, ktere nevraci mnozinu dat
> > Je mi to az blby ale i to jsem zkousel, ale vysledek
> > DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger) je roven nule.
> > Pole "ZalohyCelkem" nemam definovane v tabulce, pouze v Query jako
> > fkcalculated
>
> > begin
> > DBISAMQuery1.SQL.Clear;
> >
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> > doplatek, Sum(Zaloha) As ZalohyCelkem FROM "new.dat" Group By
> > Prijmeni,jmeno');
> > DBISAMQuery1.ExecSQL;
> >
Label2.caption:=IntToStr(DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger)
> > ;
> > end;
>
>
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: Viktor Marek
16. 12. 2002 14:19
Zdravim
Ze zoufalstvi jsem zacal zkouset vsechno mozne a nemozne porad se stejnym
vysledkem
Dopracoval jsem se k tomuto:
Jestlize v databazovych utilitach zadam select
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno
Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
Pokud dam select SUM(Zaloha) As ZalohyCelkem from "new.dat" vybehne spravna
hodnota souctu castek ve sloupci "Zalohy"
Z toho usuzuji ze select je postaven spravne ale funkce je k nicemu.
Napadla mne takovato "Zhovadilost"
Kdyz selectu vadi udaje Jmeno prijmeni .... tak je programove odebrat z
Fields Editoru Query, provest sum(zalohy),
vratit do Fields Editoru Query odebrane pole a provest dalsi select na
zobrazeni dat v DBGridu.
Urcite to lze provest jinak, ale ani s radami se mi to nepovedlo.
Takze se chci zeptat jak lze v programu provest pridani - odebrani poli ve
Fields Editoru Query
Viktor Marek
viktor@mbox.vol.cz
> V tomto pripade se pouziva DBISAMQuery1.Open ne DBISAMQuery1.ExecSQL
>
> ExecSQL se pouziva pro prikazy, ktere nevraci mnozinu dat
> > Je mi to az blby ale i to jsem zkousel, ale vysledek
> > DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger) je roven nule.
> > Pole "ZalohyCelkem" nemam definovane v tabulce, pouze v Query jako
> > fkcalculated
>
> > begin
> > DBISAMQuery1.SQL.Clear;
> >
DBISAMQuery1.SQL.Add('SELECT cislozaznamu, prijmeni, jmeno, zaloha,
> > doplatek, Sum(Zaloha) As ZalohyCelkem FROM "new.dat" Group By
> > Prijmeni,jmeno');
> > DBISAMQuery1.ExecSQL;
> >
Label2.caption:=IntToStr(DBISAMQuery1.FieldByName('ZalohyCelkem').AsInteger)
> > ;
> > end;
>
>
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: Ing. Pavel Žilinec
16. 12. 2002 14:38
Zkus misto vseho 'spravneho' pouzit podselect:
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek,
ZalohyCelkem = (select sum(pom.Zalohy) from "new.dat" pom)
FROM "new.dat"
Order by Prijmeni
Pokud jsem to pochopil dobre, chces vse podle Prijmeni a navic jeste
soucet vsech zaloh.
Jinak to lze samozrejme pustit i jako druhy samostatny dotaz, ktery
natahne pouze ty ZalohyCelkem.
--------
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
VM> Zdravim
VM> Ze zoufalstvi jsem zacal zkouset vsechno mozne a nemozne porad se stejnym
VM> vysledkem
VM> Dopracoval jsem se k tomuto:
VM> Jestlize v databazovych utilitach zadam select
VM> SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
VM> ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno
VM> Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
VM> radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
VM> Pokud dam select SUM(Zaloha) As ZalohyCelkem from "new.dat" vybehne spravna
VM> hodnota souctu castek ve sloupci "Zalohy"
VM> Z toho usuzuji ze select je postaven spravne ale funkce je k nicemu.
VM> Napadla mne takovato "Zhovadilost"
VM> Kdyz selectu vadi udaje Jmeno prijmeni .... tak je programove odebrat z
VM> Fields Editoru Query, provest sum(zalohy),
VM> vratit do Fields Editoru Query odebrane pole a provest dalsi select na
VM> zobrazeni dat v DBGridu.
VM> Urcite to lze provest jinak, ale ani s radami se mi to nepovedlo.
VM> Takze se chci zeptat jak lze v programu provest pridani - odebrani poli ve
VM> Fields Editoru Query
VM> Viktor Marek
VM> viktor@mbox.vol.cz
Odpovedá: Garalda
16. 12. 2002 14:25
>Jestlize v databazovych utilitach zadam select
>SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
>ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno
>Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
>radku "Zalohycelkem" je roven udaji ve stejnem radku >sloupce "Zalohy"
>
No ja nevim, DBISAM neznam, ale myslim, ze nic jineho to ani vracet nemuze. V
Group by se podle mne musi definovat vsechny vypisovane sloupce krome
agregacnich. Podle mne by mel ten dotaz byt:
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
ZalohyCelkem
FROM "new.dat"
Group By cislozaznamu, prijmeni, jmeno, zaloha, doplatek
S pozdravem
Garalda
______________________________________________________________________________
Ježísek letos nakupuje na HPmarket! Vyberte svym blízkým DÁREK z naší specialní
Vanoční nabídky, ve které najdete produkty pro tatínky, maminky, podnikatele,
milovníky svobody, studenty nebo děti. Vse za vyhodne VÁNOČNÍ CENY!!! HPmarket
splni vanoční přání celé Vaší rodiny. http://www.hpmarket.cz/vanoce2002
Odpovedá: Lstiburek Pavel
16. 12. 2002 14:08
Ahoj,
pokud pouzivas klazuli GROUP BY, tak vsechny sloupce,
ktere nejsou skalarni fci musi si byt v teto klauzuji uvedeny:
tedy:
SELECT cislozaznamu, prijmeni, jmeno,
zaloha, doplatek, Sum(Zaloha) As ZalohyCelkem
FROM "new.dat"
GROUP BY cislozaznamu, prijmeni, jmeno, zaloha, doplatek
coz je asi totez jako kdyby tam ten "group by" nebyl -> nesmysl (blbnuti za
pomoci technickych prostredku)
Chces-li sumovat slupec zaloha pro jednotliva prijmeni a jmena:
SELECT prijmeni, jmeno,
Sum(Zaloha) As ZalohyCelkem
FROM "new.dat"
GROUP BY prijmeni, jmeno
Pokud je "cislozaznamu" cislem jednoznacne svazanym s prijmenim a jmenem
je mozno je pridat:
SELECT cislozaznamu, prijmeni, jmeno,
Sum(Zaloha) As ZalohyCelkem
FROM "new.dat"
GROUP BY prijmeni, jmeno, cislozaznamu
Poznamka: na poradi sloupcu v GROUP BY Nezalezi
To, ze ti to nekdy neco vrati neni dukaz ze to delas dobre (ze select je
spravne),
ale ze i slepe kure obcas zobne zrno.
Pokud ma byt rada k necemu je treba rici, jaka je struktura tabulky, kterou
sumujes
a co chces ziskat.
Nebot napsat to tak, aby to nevracelo nulu lze vice zpusoby.
Pavel
> From: Viktor Marek [mailto:viktor@mbox.vol.cz]
> Ze zoufalstvi jsem zacal zkouset vsechno mozne a nemozne
> porad se stejnym
> vysledkem
> Dopracoval jsem se k tomuto:
>
> Jestlize v databazovych utilitach zadam select
> SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
> ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno
> Objevi se v databazove tabulce novy sloupec Zalohycelkem kde
> kazdy udaj v
> radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
>
> Pokud dam select SUM(Zaloha) As ZalohyCelkem from "new.dat"
> vybehne spravna
> hodnota souctu castek ve sloupci "Zalohy"
>
> Z toho usuzuji ze select je postaven spravne ale funkce je k nicemu.
>
> Napadla mne takovato "Zhovadilost"
> Kdyz selectu vadi udaje Jmeno prijmeni .... tak je programove
> odebrat z
> Fields Editoru Query, provest sum(zalohy),
> vratit do Fields Editoru Query odebrane pole a provest dalsi select na
> zobrazeni dat v DBGridu.
> Urcite to lze provest jinak, ale ani s radami se mi to nepovedlo.
>
> Takze se chci zeptat jak lze v programu provest pridani -
> odebrani poli ve
> Fields Editoru Query
Odpovedá: bardon
16. 12. 2002 15:37
Ja se do toho nechci vrtat, ale obecne vzato uvedeny selekt je z hlediska
SQL jazyka nesmysl z techto duvodu:
1) nejde mit v result setu soucasne zaloha a soucasne sum(zaloha) - bud chci
zalohy jednotlive, nebo sumovane, je logicky nesmysl chtit oboji najednou
2) v group by by mely byt vyjmenovany vsechny nepocitane sloupce, protoze
ale predpokladam, ze cislozaznamu se vaze k jedne zaloze a nechces podle nej
sumovat, pak si myslim, ze by nemelo byt v selektu a totez se tyka polozky
doplatek - bud ji sumuj, nebo neuvadej
tedy selekt by mel vypadat cca takto:
SELECT prijmeni, jmeno, Sum(Zaloha) As ZalohyCelkem
FROM "new.dat" Group By Prijmeni,jmeno
nebo
SELECT prijmeni, jmeno, Sum(doplatek) As DoplatkyCelkem, Sum(Zaloha) As
ZalohyCelkem
FROM "new.dat" Group By Prijmeni,jmeno
Jestli pouzivas Fields Editor, tak si urcite smaz vsechny fieldy, uprav
select a pak tam znovu nech vygenerovat vsechny fieldy.
Pochopitelne zalezi na databazovem stroji, kazdy pripousti jinou syntaxi,
ale tipuji, ze to, co jsem napsal bude chodit na vsech strojich.
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz]On
Behalf Of Viktor Marek
Sent: Monday, December 16, 2002 1:11 PM
Ze zoufalstvi jsem zacal zkouset vsechno mozne a nemozne porad se stejnym
vysledkem
Dopracoval jsem se k tomuto:
Jestlize v databazovych utilitach zadam select
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
ZalohyCelkem FROM "new.dat" Group By Prijmeni,jmeno
Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
Pokud dam select SUM(Zaloha) As ZalohyCelkem from "new.dat" vybehne spravna
hodnota souctu castek ve sloupci "Zalohy"
Z toho usuzuji ze select je postaven spravne ale funkce je k nicemu.
Napadla mne takovato "Zhovadilost"
Kdyz selectu vadi udaje Jmeno prijmeni .... tak je programove odebrat z
Fields Editoru Query, provest sum(zalohy),
vratit do Fields Editoru Query odebrane pole a provest dalsi select na
zobrazeni dat v DBGridu.
Urcite to lze provest jinak, ale ani s radami se mi to nepovedlo.
Takze se chci zeptat jak lze v programu provest pridani - odebrani poli ve
Fields Editoru Query
Odpovedá: Viktor Marek
16. 12. 2002 16:05
Zdravim
Vyzkousel jsem
Ing Pavel Zilinec
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, ZalohyCelkem =
(select sum(pom.Zalohy) from "new.dat" pom) FROM "new.dat"
select jde do chyby
"Right parentheses expected, instead found 'sum' in
source column expression"
Garalda
SELECT cislozaznamu, prijmeni, jmeno, zaloha, doplatek, Sum(Zaloha) As
ZalohyCelkem FROM "new.dat" Group By cislozaznamu, prijmeni, jmeno, zaloha,
doplatek
Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
Lstiburek Pavel
Objevi se v databazove tabulce novy sloupec Zalohycelkem kde kazdy udaj v
radku "Zalohycelkem" je roven udaji ve stejnem radku sloupce "Zalohy"
Zkusim jeste jednou shrnout problem
Tabulka je tvorena udaji:
CisloZaznamu AutoInc
Prijmeni String
Jmeno String
Zaloha Integer
Doplatek Integer
Na Formu mam DBgrid, DataSource a Query a v SQLTsrings
"select * from
"new.dat" order by Prijmeni"
V Query FieldsEditoru mam pole
CisloZaznamu fkdata
Prijmeni fkdata
Jmeno fkdata
Zaloha fkdata
Doplatek fkdata
Celkem fkcalculated poveseno na Query OnCalcFields
ZalohyCelkem fkcalculated
V DBGridu mam tedy osoby serazeny podle Prijmeni. Po zmene vyse Zalohy
(doplatku) potrebuji dostat do promene sumu Zaloh (doplatku) za vsechny
osoby ve sloupci Zaloha (doplatek)
Diky vsem za radu
Viktor Marek
viktor@mbox.vol.cz
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: Lstiburek Pavel
16. 12. 2002 16:03
Ahoj,
pokud je "suma" za vsechny zaznamy v tabulce, potom tedy:
napr.:
================================================
dopln jeste jeden Sumy : TQuery
se SQL =
'SELECT SUM( zaloha) AS ZalohaCelkem, SUM( Doplatek) AS
DoplatekCelkem FROM new.dat'
v OnCreate formu staci Sumy.Open;
v Query.AfterPost dopln:
begin
Sumy.refresh;
end;
pokud chces mit v gridu sloupec se tou sumou tak do
ZalohyCelkemGetText := FloatToStr( Sumy.FieldByName['ZalohaCelkem']);
dtto do pro Doplatky.
jinak pokud nemusí byt ZalohaCelkem v gridu
tak to dej primo na form TDBEdit a pripoj ho k Sumy (pres ds...).
Pavel
> From: Viktor Marek [mailto:viktor@mbox.vol.cz]
> Zkusim jeste jednou shrnout problem
> Tabulka je tvorena udaji:
>
> CisloZaznamu AutoInc
> Prijmeni String
> Jmeno String
> Zaloha Integer
> Doplatek Integer
>
> Na Formu mam DBgrid, DataSource a Query a v SQLTsrings
"select * from
> "new.dat" order by Prijmeni"
> V Query FieldsEditoru mam pole
> CisloZaznamu fkdata
> Prijmeni fkdata
> Jmeno fkdata
> Zaloha fkdata
> Doplatek fkdata
> Celkem fkcalculated poveseno na Query OnCalcFields
> ZalohyCelkem fkcalculated
>
> V DBGridu mam tedy osoby serazeny podle Prijmeni. Po zmene vyse Zalohy
> (doplatku) potrebuji dostat do promene sumu Zaloh (doplatku)
> za vsechny
> osoby ve sloupci Zaloha (doplatek)
Odpovedá: Blazek Jaroslav
16. 12. 2002 17:05
Ahoj,
> viktor@mbox.vol.cz 16.12.02 15:31 >>>
>Zkusim jeste jednou shrnout problem
>Tabulka je tvorena udaji:
>CisloZaznamu AutoInc
>Prijmeni String
>Jmeno String
>Zaloha Integer
>Doplatek Integer
>Na Formu mam DBgrid, DataSource a Query a v SQLTsrings
"select * from
>"new.dat" order by Prijmeni"
>V Query FieldsEditoru mam pole
>CisloZaznamu fkdata
>Prijmeni fkdata
>Jmeno fkdata
>Zaloha fkdata
>Doplatek fkdata
>Celkem fkcalculated poveseno na Query OnCalcFields
>ZalohyCelkem fkcalculated
>V DBGridu mam tedy osoby serazeny podle Prijmeni. Po zmene vyse Zalohy
>(doplatku) potrebuji dostat do promene sumu Zaloh (doplatku) za vsechny
>osoby ve sloupci Zaloha (doplatek)
tohle jsou ale vsechno zaklady SQL, SELECT ... GROUP BY
a hlavne v tomhle pripade to mas uz spatne navrzeno
mam zamestnance
1. Pavel Vomacka
2. Pavel Vomacka
3. Karel Opicka
4. Gabina Hrava
v tabulce je to podle tebe ulozeno
CisloZaznamu, Jmeno, Prijmeni, Zaloha, Doplatek
1, Pavel, Vomacka, 1000, 2000
2, Pavel, Vomacka, 2000, 1500
3, Gabina, Hrava, 1500, 1000
4, Pavel, Vomacka, 1000, 2000
kteremu Vomackovi byla zaloha vyplacena ??? Prvnimu nebo druhemu ???
"Nejlepsi" je pridat dalsi pole, treba CisloClovicka nebo IdClovicka
atd..proste jednoznacna identifikace
SELECT z.Jmeno, z.Prijmeni, s.SumZaloha
FROM
(SELECT DISTINCT IdClovicek, Jmeno, Prijmeni FROM "new.dat") z,
(SELECT IdClovicek, SUM(Zaloha) AS SumZaloha FROM "new.dat" GROUP BY
IdClovicek) s
WHERE z.IdClovicek = s.IdClovicek
dale uz postradaji smysl pole Doplatek, Celkem, CisloZaznamu
pokud to chces mit tak "nenormalne" jak to mas v DBGridu, tak potom staci
SELECT z.CisloZaznamu, z.Jmeno, z.Prijmeni, z.Zaloha, z.Doplatek, s.SumZaloha
FROM "new.dat" z,
(SELECT IdClovicek, SUM(Zaloha) AS SumZaloha FROM "new.dat" GROUP BY
IdClovicek) s
WHERE z.IdClovicek = s.IdClovicek
Stejne bych to ale predelal, tabulky do 5 normalni formy
jinak tady jsou dalsi prikladky jak funguje GROUP BY, tak si to preber
1.
SELECT Jmeno, Prijmeni, SUM(Zaloha) AS SumZaloha
FROM "new.dat"
GROUP BY Jmeno, Prijmeni
vybere
Pavel, Vomacka, 4000
Gabina, Hrava, 1500
2.
SELECT CisloZaznamu, SUM(Zaloha) AS SumZaloha
FROM "new.dat"
GROUP BY CisloZaznamu
vybere
1, 1000
2, 2000
3, 1500
4, 1000
S pozdravem
Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644
Odpovedá: Viktor Marek
16. 12. 2002 19:36
Zdravim
Predem vsem moc dekuji za rady a napady. Myslim si ale, ze jsem nebyl
pochopen nebo jsem se neuplne snad i blbe vyjadroval.
Programek je jednoducha aplikace pro vypocet mincovky pro banku kde jsem pro
jednoduchost volil zapis primo do DBGridu (uz slysim FUJ)
To znamena ze zapisuji vysi Zalohy nebo Dobirky primo do DBGridu a v radku
celkem se mi zobrazuje soucet obou polozek
>kteremu Vomackovi byla zaloha vyplacena ??? Prvnimu nebo druhemu ???
Vomacka je presne identifikovan dle "CisloZaznamu"
procedure TForm1.DBISAMQuery1ZalohaChange(Sender: TField);
var CisloZaznamu, zaloha : integer;
begin
zaloha:=DBIsamQuery1zaloha.value;
CisloZaznamu:=DBIsamQuery1CisloZaznamu.value;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.Add('Update new set zaloha=' + IntToStr(zaloha) +
' where
CisloZaznamu =' + IntToStr(cislozaznamu));
DBISAMQuery1.ExecSQL;
DBISAMQuery1.SQL.Clear;
DBISAMQuery1.SQL.add('select * from "new.dat" order by Prijmeni');
DBISAMQuery1.ExecSQL;
To znamena ze, nepotrebuji Sumovat Zalohy (Dobirky) v radku osoby ale zajima
mne suma vsech zaznamu sloupce Zaloha (Dobirka)
Tento sloupec obsahuje vsechny osoby. Hodnotu souctu vsech zaloh (Doplatku)
pak pouziji pro dalsi vypocet.
Prozatim jsem to vyresil tak, ze prochazim cyklem tabulku a nascitavam
jednotlive castky Zaloh (Dobirek) vseh osob v tabulce. Funguje to ale musi
prece existovat reseni i pres SQL.
Pokud by nekdo na neco prisel byl bych vdecen.
Viktor Marek
viktor@mbox.vol.cz
>Zkusim jeste jednou shrnout problem
>Tabulka je tvorena udaji:
>CisloZaznamu AutoInc
>Prijmeni String
>Jmeno String
>Zaloha Integer
>Doplatek Integer
>Na Formu mam DBgrid, DataSource a Query a v SQLTsrings
"select * from
>"new.dat" order by Prijmeni"
>V Query FieldsEditoru mam pole
>CisloZaznamu fkdata
>Prijmeni fkdata
>Jmeno fkdata
>Zaloha fkdata
>Doplatek fkdata
>Celkem fkcalculated poveseno na Query OnCalcFields
>ZalohyCelkem fkcalculated
>V DBGridu mam tedy osoby serazeny podle Prijmeni. Po zmene vyse Zalohy
>(doplatku) potrebuji dostat do promene sumu Zaloh (doplatku) za vsechny
>osoby ve sloupci Zaloha (doplatek)
>tohle jsou ale vsechno zaklady SQL, SELECT ... GROUP BY
>a hlavne v tomhle pripade to mas uz spatne navrzeno
>mam zamestnance
>1. Pavel Vomacka
>2. Pavel Vomacka
>3. Karel Opicka
>4. Gabina Hrava
>v tabulce je to podle tebe ulozeno
>CisloZaznamu, Jmeno, Prijmeni, Zaloha, Doplatek
>1, Pavel, Vomacka, 1000, 2000
>2, Pavel, Vomacka, 2000, 1500
>3, Gabina, Hrava, 1500, 1000
>4, Pavel, Vomacka, 1000, 2000
>kteremu Vomackovi byla zaloha vyplacena ??? Prvnimu nebo druhemu ???
>"Nejlepsi" je pridat dalsi pole, treba CisloClovicka nebo IdClovicka
atd..proste jednoznacna identifikace
>SELECT z.Jmeno, z.Prijmeni, s.SumZaloha
>FROM
>(SELECT DISTINCT IdClovicek, Jmeno, Prijmeni FROM "new.dat") z,
>(SELECT IdClovicek, SUM(Zaloha) AS SumZaloha FROM "new.dat" GROUP BY
IdClovicek) s
>WHERE z.IdClovicek = s.IdClovicek
>dale uz postradaji smysl pole Doplatek, Celkem, CisloZaznamu
>pokud to chces mit tak "nenormalne" jak to mas v DBGridu, tak potom staci
>SELECT z.CisloZaznamu, z.Jmeno, z.Prijmeni, z.Zaloha, z.Doplatek,
s.SumZaloha
>FROM "new.dat" z,
>(SELECT IdClovicek, SUM(Zaloha) AS SumZaloha FROM "new.dat" GROUP BY
IdClovicek) s
>WHERE z.IdClovicek = s.IdClovicek
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: Ján Harman
15. 12. 2002 17:33
Field "Prijmeni" tam predse ani nedavas do selectu, tak proto ti hlasi
ze neexistuje. V tvem vysledku je jediny sloupec a to "ZalohyCelkem".
Ján Harman
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Viktor Marek
Sent: Sunday, December 15, 2002 3:28 PM
To: Konference Delphi 2000
Subject: SQL
Zdravim
Uz dloho se potykam s timto problemem - Delphi 5, database DBIsam
Mam tabulku ke ktere pristupuji pomoci SQL dotazu.
Pri FormCreate zobrazuji data v DBGridu pres select * from "test.dat"
order
by Prijmeni
Dale mam na formu Label ve kterem bych chtel zobrazovat soucet sloupce
Zaloha
Jakmile ale chci provest nize uvedeny Select vybehne ERROR
"Query1 Field
"Prijmeni" not found"
Query1.SQL.Clear;
Query1.SQL.Add('SELECT SUM(Zaloha) As ZalohyCelkem from "test.dat"');
Query1.Open;
Label1.caption:=IntToStr(Query1.FieldByName('ZalohyCelkem').AsInteger);
Neco mi naseptava, ze by to chtelo slozeny select ale nevim jak dal.
Diky za radu
Viktor Marek
viktor@mbox.vol.cz
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002
Odpovedá: Viktor Marek
15. 12. 2002 22:31
Zdravim
To jsem pochopil, ale porad mi neni jasne jak slozit SQl prikaz dohromady
select * from "test.dat" order by Prijmeni se SELECT SUM(Zaloha) As
ZalohyCelkem from
"test.dat"'
Viktor Marek
viktor@mbox.vol.cz
>Field "Prijmeni" tam predse ani nedavas do selectu, tak proto ti hlasi
>ze neexistuje. V tvem vysledku je jediny sloupec a to "ZalohyCelkem".
>Ján Harman
>Uz dloho se potykam s timto problemem - Delphi 5, database DBIsam
>Mam tabulku ke ktere pristupuji pomoci SQL dotazu.
>Pri FormCreate zobrazuji data v DBGridu pres select * from "test.dat"
>order
>by Prijmeni
>Dale mam na formu Label ve kterem bych chtel zobrazovat soucet sloupce
>Zaloha
>Jakmile ale chci provest nize uvedeny Select vybehne ERROR "Query1 Field
>"Prijmeni" not found"
>Query1.SQL.Clear;
> Query1.SQL.Add('SELECT
SUM(Zaloha) As ZalohyCelkem from
"test.dat"');
> Query1.Open;
>Label1.caption:=IntToStr(Query1.FieldByName('ZalohyCelkem').AsInteger);
---
Odchozí zpráva neobsahuje viry.
Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz).
Verze: 6.0.427 / Virová báze: 240 - datum vydání: 6.12.2002